<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<script src="../vue.js" type="text/javascript"></script>
		<title>自定义事件</title>
		<!-- https://v2.cn.vuejs.org/v2/guide/components-custom-events.html  -->
	</head>
	<body>
		<div id="event1">{{title}}
			<base-checkbox v-model="lovingVue" v-on:change="addchange"></base-checkbox>
			<!-- 
		 这里的 lovingVue 的值将会传入这个名为 checked 的 prop。同时当 <base-checkbox> 触发一个 change 事件并附带一个新的值的时候，这个 lovingVue 的 property 将会被更新。
		 -->

			<!-- 将原生事件绑定到组件 -->
			</br>
			</br>
			<base-input1 v-bind:label="label" v-on:input="input"></base-input1>
			<!-- <base-input1 v-bind:label="label" v-bind:value="inputValue" v-on:focus.native="onFocus"></base-input1> -->
			</br>
			</br>
			<base-input2 v-bind:label="label" v-bind:value="inputValue2" @myinput="input2"></base-input2>
			</br>
			</br>
			<!-- .sync 修饰符 -->
			<text-document v-bind:title="mytitle"></text-document>
			</br>
			<text-document v-bind:title.sync="synctTitle"></text-document>
			</br>
		</div>
	</body>

	<script>
		Vue.component('base-checkbox', {
			model: {
				prop: 'checked',
				// 注释掉了 addchange 也可以接受到 change 事件
				// event: 'change'
			},
			props: {
				checked: Boolean
			},
			template: `
		    <input
		      type="checkbox"
		      v-bind:checked="checked"
		      v-on:change="$emit('change', $event.target.checked)"
		    >
		  `
		})

		Vue.component('base-input1', {
			props: ['label', 'value'],
			template: `
		    <label>
		      {{ label }}：
		      <input
		        v-bind="$attrs"
		        v-bind:value="value"
				v-on:input="$emit('input', $event.target.value)"
		      >
		    </label>
		  `
		})


		Vue.component('base-input2', {
			inheritAttrs: false,
			props: ['label', 'value'],
			computed: {
				inputListeners: function() {
					var vm = this
					// `Object.assign` 将所有的对象合并为一个新对象
					return Object.assign({},
						// 我们从父级添加所有的监听器
						this.$listeners,
						// 然后我们添加自定义监听器，
						// 或覆写一些监听器的行为
						{
							// 这里确保组件配合 `v-model` 的工作
							input: function(event) {
								vm.$emit('myinput', event.target.value)
							}
						}
					)
				}
			},
			template: `
		    <label>
		      {{ label }}：
		      <input
		        v-bind="$attrs"
		        v-bind:value="value"
		        v-on="inputListeners"
		      >
		    </label>
		  `
		})


		// .sync 修饰符
		Vue.component('text-document', {
			props: ['title'],
			
			template: `
				<div>
				{{title}}
				</div>
				`
		})

		var data = {
			title: '自定义事件',
			// lovingVue 的值将会传入这个名为 checked 的 prop
			lovingVue: false,
			label: "请输入用户名",
			inputValue: "开发者",
			inputValue2: "开发者2",
			mytitle:"未使用 sync 修饰符",
			synctTitle: "使用 sync 修饰符",
		}

		var vm1 = new Vue({
			el: '#event1',
			data: data,

			// mounted() {
			// 	console.log("执行了 mounted")
			// },
			methods: {
				addchange(value) {
					console.log("接收到 change value = " + value)
				},

				onFocus(value) {
					console.log("接收到 onFocus value = " + value)
				},

				input(value) {
					console.log("接收到 input value = " + value)
				},
				input2(value) {
					console.log("接收到 input2 value = " + value)
				},
			}

		})
	</script>
</html>